package com.kgame5.xtank3d.effect {
import kgame5.enginex.enum.Layer3DEnum;
import kgame5.k3d.core.math.Vector3D;
import kgame5.k3d.core.obj3d.hardvo.HardVO;
import kgame5.k3d.core.obj3d.node3d.Group3D;
import kgame5.k3d.pars.ParticlesEngine;
import kgame5.kmath.MathDG;
import kgame5.kutil.T;

import com.kgame5.xtank3d.GameEnum;
import com.kgame5.xtank3d.effect.myemitters.BlastMainEmitter;
import com.kgame5.xtank3d.effect.myemitters.BlastWaveEmitter;
import com.kgame5.xtank3d.effect.myemitters.BreakBarEmitter;
import com.kgame5.xtank3d.effect.myemitters.CannonSmokeEmitter;
import com.kgame5.xtank3d.effect.myemitters.CraterEmitter;
import com.kgame5.xtank3d.effect.myemitters.DieBloodEmitter;
import com.kgame5.xtank3d.effect.myemitters.DustEmitter;
import com.kgame5.xtank3d.effect.myemitters.HammerEmitter;
import com.kgame5.xtank3d.effect.myemitters.HurtBloodEmitter;
import com.kgame5.xtank3d.effect.myemitters.MissileSmokeEmitter;
import com.kgame5.xtank3d.effect.myemitters.PoisonGroundEmitter;
import com.kgame5.xtank3d.effect.myemitters.PoisonPaosEmitter;
import com.kgame5.xtank3d.effect.myemitters.QuakeWaveEmitter;
import com.kgame5.xtank3d.effect.myemitters.ShotChipsEmitter;
import com.kgame5.xtank3d.effect.myemitters.ShotShellEmitter;
import com.kgame5.xtank3d.effect.myemitters.ShotSmokeEmitter;
import com.kgame5.xtank3d.effect.myemitters.SparkEmitter;
import com.kgame5.xtank3d.effect.myemitters.SuicideDustEmitter;
import com.kgame5.xtank3d.effect.myemitters.TankDieBlastWaveEmitter;
import com.kgame5.xtank3d.effect.myemitters.TankDieChipsEmitter;
import com.kgame5.xtank3d.effect.myemitters.TankHurtChipsEmitter;
import com.kgame5.xtank3d.effect.myemitters.VerticalBlastEmitter;
import com.kgame5.xtank3d.vo.BlastVO;
import com.kgame5.xtank3d.vo.BlockVO;
import com.kgame5.xtank3d.vo.MyTankVO;
import com.kgame5.xtank3d.vo.ShotVO;

/**
 * @author kangkai
 * 3D特效
 * 1,炮弹爆炸
 * 2，坦克爆炸
 * 3,坦克受伤
 * 4，坦克烟雾
 * * 6，弹壳
 * * 3，吃了道具
 * 5，导弹烟雾
 * 
 * 注意effComp需要直接操纵world,这个是因为太多的小粒子，就直接添加到world里去吧，————虽然这样违背pureMVC结构
 */
public class Eff3DManager{
	
	private static var instance:Eff3DManager;
	public static function getInstance():Eff3DManager{
		if(instance==null){
			instance=new Eff3DManager();
		}
		return instance;
	}
	
	//爆炸效果
	public function blast(vo:BlastVO):void{
		switch(vo.type){
			case GameEnum.BLAST_TYPE_NORMAL://常规炮弹爆炸
			blastNormal(vo);
			break;
			case GameEnum.BLAST_TYPE_POISON://毒药爆炸
			blastPoisonPao(vo);
			break;
			case GameEnum.BLAST_TYPE_HAMMER://锤子反弹
			blastHammer(vo);
			break;
		}
	}
	
	//普通炮弹爆炸:炮弹碎片,烟雾，弹坑
	public  function blastNormal(vo:BlastVO):void{
		var p:Vector3D = vo.posi;
		
		//冲击波
		this.addToParticlesEngine(
			new BlastWaveEmitter(vo.WAVE).md_g,
			 p.x, 0, p.z);
		
		//弹坑
		this.addToParticlesEngine(
			new CraterEmitter().md_g,
			p.x, 0, p.z);
		//烟雾
		this.addToParticlesEngine(
			new BlastMainEmitter().md_g,
			p.x, p.y, p.z);
		//炮弹碎片
		this.addToParticlesEngine(
			new ShotChipsEmitter().md_g,
			p.x, p.y, p.z);
	}

	//毒药瓶子爆炸:毒气泡往上飘,地面毒药水
	public  function blastPoisonPao(vo:BlastVO):void{
		T.p("blastPoisonPao");
		var p:Vector3D = vo.posi;
		
		
		this.addToParticlesEngine(
			new PoisonGroundEmitter().md_g,
			p.x, 0, p.z);
		
		this.addToParticlesEngine(
			new PoisonPaosEmitter(vo.WAVE).md_g, 
			p.x, 0, p.z);
		
	}
	
	//锤子砸到地面:锤子弹起，地面冲击波
	public  function blastHammer(vo:BlastVO):void{
		var p:Vector3D = vo.posi;
		
		this.addToParticlesEngine(
			new QuakeWaveEmitter(vo.WAVE).md_g,
			p.x, 0, p.z);
		
		this.addToParticlesEngine(
			new HammerEmitter().md_g, 
			p.x, p.y, p.z);
	}
	
	//障碍物爆炸的碎片，板儿砖？,什么模型都可以，要的是合金弹头的效果
	//发射,!!严重注意这个用的时候如果落地了就消失了的可是！！
	public function breakBar(vo:BlockVO):void{
		var p:Vector3D = vo.hardVO.v3d_p;
		this.addToParticlesEngine(
			new BreakBarEmitter(vo).md_g, p.x, p.y, p.z
		);
	}
	
	//buType就是bu的typeID
	public function BUDie(p:Vector3D,buType:int):void{
		switch(buType){
			case GameEnum.BU_TYPE_TANK:
			tankDie(p);
			break;
			case GameEnum.BU_TYPE_CART:
			cartDie(p);
			break;
		}
	}
	
	//一个坦克被消灭!!发现了原来拍的时候是按照mc_c在世界0,0，0的位置排的序！
	//地面一滩血液，垂直爆炸烟雾，坦克部件炸飞
	private  function tankDie(p:Vector3D):void{
		
		//爆炸
		this.addToParticlesEngine(
			new BlastMainEmitter().md_g,
			p.x, p.y, p.z);
		
		//爆炸的圈
		this.addToParticlesEngine(
			new TankDieBlastWaveEmitter().md_g,
			p.x, p.y, p.z);
		
		//地面一滩血液
		//是爆炸中心就在坦克中心，试试这样能不能弄出一滩血液来
		this.addToParticlesEngine(
			new DieBloodEmitter(36,13,6).md_g,
			p.x, p.y, p.z);
			
//		//坦克部件飞
		this.addToParticlesEngine(
			new TankDieChipsEmitter(20).md_g,
			p.x, p.y, p.z);
		
	}
	
	//一个坦克被消灭!!发现了原来拍的时候是按照mc_c在世界0,0，0的位置排的序！
	//地面一滩血液，垂直爆炸烟雾，坦克部件炸飞
	private  function cartDie(p:Vector3D):void{
		
		//爆炸
		this.addToParticlesEngine(
			new VerticalBlastEmitter(32).md_g,
			p.x, p.y, p.z);
		
		//爆炸的圈
		this.addToParticlesEngine(
			new TankDieBlastWaveEmitter().md_g,
			p.x, p.y, p.z);
		
		//地面一滩血液
		//是爆炸中心就在坦克中心，试试这样能不能弄出一滩血液来
		this.addToParticlesEngine(
			new DieBloodEmitter(76,25,MathDG.random(8,12)).md_g,
			p.x, p.y, p.z);
			
//		//坦克部件飞
		this.addToParticlesEngine(
			new TankDieChipsEmitter(40).md_g,
			p.x, p.y, p.z);
		
	}

	//坦克受伤:地面血液，坦克小零件飞
	public  function BUHurt(
					shot:Vector3D,//爆炸点的坐标
					tank:Vector3D,
					tankRange:int//坦克半径
					):void{
		T.p("BUHurt");
		
		var bp:Vector3D=shot.clone();
		var tp:Vector3D=tank.clone();
		
		//T.p("tank",tp);
		//T.p("shot:",bp);
		//1,喷血,注意这个的喷血是在外面做的
		this.addToParticlesEngine(
			new HurtBloodEmitter(bp,tp).md_g,
			tp.x, 0, tp.z);
			
		//2,坦克部件飞
		//~其实用2D动画就可以了。谁也不会关心这个是否是个真的
		this.addToParticlesEngine(
			new TankHurtChipsEmitter(bp,tp).md_g,
			tp.x, tp.y, tp.z);
	}
	
	//模拟扬起的尘土，是抛物线形的
	public  function dust(p:Vector3D):void{
		this.addToParticlesEngine(
			new DustEmitter().md_g,
			p.x, p.y, p.z);
	}
	//坦克自杀的时候扬起的尘土，是血块模拟扬起的尘土，是抛物线形的
	public  function dustSuicide(p:Vector3D):void{
		this.addToParticlesEngine(new SuicideDustEmitter().md_g,
			p.x, p.y, p.z);
	}
	//坦克开炮:弹壳,炮口烟雾
	public function tankFire(vo:MyTankVO):void{
		var hardVO:HardVO=vo.hardVO;
		var p:Vector3D=hardVO.v3d_p;
		var rotY:int=hardVO.v3d_r.y + vo.barbRotY;
		
		//--弹壳
		var y:int=p.y+hardVO.aabb.H/2;//抛射弹壳的y,注意这个的md_g.y=0要,这样才能有弹壳落地的效果
		//注意H要除以2，因为这个H是为了做好碰撞检测而乘以2的
		this.addToParticlesEngine(
			new ShotShellEmitter(y,rotY).md_g,
			p.x, 0, p.z);
		
		//--炮口烟雾
		var smokePosi:Vector3D=Vector3D.SPolarXOZ(rotY, hardVO.bball.R);
		smokePosi.y += vo.body.cannonY;//炮口位置;//playerVO.tank.head.v3d_p.y+10;//TODO 炮口位置
		smokePosi.add(p);
		this.addToParticlesEngine(
			new CannonSmokeEmitter(rotY).md_g,
			smokePosi.x, smokePosi.y, smokePosi.z);

	}
	//吃了道具有个小粒子效果,直接用一个mc来演示了这个动画
	//参数是爆炸起始的位置
	public function spark(p:Vector3D):void{
		//T.p("Spark");
		this.addToParticlesEngine(
			new SparkEmitter().md_g,
			p.x, p.y, p.z);
	}
	public function shotSmoke(shotVO:ShotVO):void{
		//T.p("------shotSmoke-------");
		
		switch(shotVO.typeID) {
			case GameEnum.SHOTTYPE_DEFAULT_MID://常规炮弹
			_shotSmoke(shotVO);
			break;
			
			case GameEnum.SHOTTYPE_MISSILE://导弹
			_missileSmoke(shotVO);
			break;
			
			case GameEnum.SHOTTYPE_HAMMER://锤子残影
			_hammerSmoke(shotVO);
			break;
			
//			case FlagGame.SHOTTYPE_SHARP://穿甲弹残影
//			this._sharpShotSmoke(shotVO);
//			break;
			
			case GameEnum.SHOTTYPE_POISON://毒药瓶子残影
			this._poisonSmoke(shotVO);
			break;
		}
	}
	
	//飞行中的物体冒烟
	//这个是假设原来模型是球体，则冒烟的位置是速度的反方向，位置在球体的边缘
	public  function _shotSmoke(shotVO:ShotVO):void{
		var hardVO:HardVO= shotVO.hardVO;
		
		//1，取得烟雾位置
		var p:Vector3D= MathDG.CalcFlySphereTail(hardVO.v3d_p, hardVO.v3d_v, hardVO.bball.R);
		
//		//4，显示
		this.addToParticlesEngine(
			new ShotSmokeEmitter().md_g, p.x, p.y, p.z);
		
	}
	
	//导弹的烟雾
	public  function _missileSmoke(shotVO:ShotVO):void{
		var hardVO:HardVO= shotVO.hardVO;
		
		//1，取得烟雾位置
		var p:Vector3D= MathDG.CalcFlySphereTail(hardVO.v3d_p, hardVO.v3d_v, hardVO.bball.R);
		
		//4,显示
		this.addToParticlesEngine(
			new MissileSmokeEmitter().md_g,
			p.x, p.y, p.z);
	}
	//锤子的烟雾
	public  function _hammerSmoke(shotVO:ShotVO):void{
		throw new Error("未实现");
//		//1，取得烟雾位置
//		var p:Vector3D= MathDG.CalcFlySphereTail(shotVO.hardVO.v3d_p, shotVO.hardVO.v3d_v, shotVO.hardVO.bball.R);
//		
//		//4,显示
//		var rn:Res3DName=Res3DNameManager.shot(shotVO.typeInfo.type);
//		
//		this.addToParticlesEngine(
//			new PhantomEmitter(rn,shotVO.hard).md_g,
//			p.x, p.y, p.z);
	}
	
	//穿甲弹的残影
	public  function _sharpShotSmoke(shotVO:ShotVO):void{
		throw new Error("未实现");
//		//1，取得烟雾位置
//		var p:Vector3D= MathDG.CalcFlySphereTail(shotVO.hardVO.v3d_p, shotVO.hardVO.v3d_v, shotVO.hardVO.bball.R);
//		
//		//4,显示
//		var rn:Res3DName=Res3DNameManager.shot(shotVO.typeInfo.type);
//		
//		this.addToParticlesEngine(
//			new PhantomEmitter(rn,shotVO.hard).md_g,
//			p.x, p.y, p.z);
	}
	
	//毒药瓶子的残影
	public  function _poisonSmoke(shotVO:ShotVO):void{
		throw new Error("未实现");
//		//1，取得烟雾位置
//		var p:Vector3D= MathDG.CalcFlySphereTail(shotVO.hard.v3d_p, shotVO.hard.v3d_v, shotVO.hard.bball.R);
//		
//		//4,显示
//		var rn:Res3DName=Res3DNameManager.shot(shotVO.typeInfo.type);
//		
//		this.addToParticlesEngine(
//			new PhantomEmitter(rn,shotVO.hard).md_g,
//			p.x, p.y, p.z);
	}
	
	//发送事件，添加模型到世界中
	private function addToParticlesEngine(md:Group3D,x:int,y:int,z:int):void{
		md.posi.fill(x, y, z);
		
		if(md.layerID==0){
			md.layerID=Layer3DEnum.LAYER_MAIN;
		}
		
		
		ParticlesEngine.getInstance().addGroup(md);//添加到粒子管理器中
	}
	
	
}//end of class
}
